#ifdef	__cplusplus
extern "C" {
#endif

#define EDITBOX_TEXT_EXCEED         -2
#define EDITBOX_SUCCESS             0
#define EDITBOX_FAILURE             -1

#define EDITBOX_MAX_NUMBER          50          //!< Numero maximo de editboxes
#define EDITBOX_MAX_TEXT            1002
#define EDITBOX_SELECTED_OFFSET     0x20

#define EDITBOX_MODE_NUMERIC        0       //!< Modo numerico para editbox
#define EDITBOX_MODE_TEXT           1       //!< Modo texto para editbox
#define EDITBOX_MODE_PASSWORD       2       //!< Modo password para editbox

    /**
     * @brief Cria um editbox.
     * @param unsigned int x             Coordenada x da posiçao do editbox.
     * @param unsigned int y             Coordenada y da posiçao do editbox.
     * @param unsigned int width         Largura do editbox em pixels.
     * @param unsigned int height        Altura do editbox em pixels.
     * @param unsigned int r             Definiçao da cor em RGB.
     * @param unsigned int g             Definiçao da cor em RGB.
     * @param unsigned int b             Definiçao da cor em RGB.
     * @param unsigned char *text        Texto do editbox.
     * @param unsigned int font_height   Altura da fonte.
     * @return int              Retorna o id do editbox ou EDITBOX_FAILURE em caso de falha.
     */
    extern int editbox_create(unsigned int x, unsigned int y, unsigned int width,
            unsigned int r, unsigned int g, unsigned int b, unsigned char *text,
            unsigned int font_height, unsigned int font_r, unsigned int font_g,
            unsigned int font_b, unsigned int border);

    extern signed int editbox_destroy(signed int editboxId);

    /**
     * @brief Desenha o editbox no buffer da janela a ele associada.
     * @param int editboxId     Id do editbox.
     * @return int              Retorna EDITBOX_SUCCESS ou EDITBOX_FAILURE.
     * @see screen_insertEditbox
     */
    extern int editbox_draw(int editboxId);

    /**
     * @brief Seleciona o editbox.
     * @param int editboxId     Id do editbox.
     * @return int              Retorna EDITBOX_SUCCESS ou EDITBOX_FAILURE.
     */
    extern int editbox_select(int editboxId);

    /**
     * @brief Deseleciona o editbox
     * @param int editboxId     Id do editbox.
     * @return int              Retorna EDITBOX_SUCCESS ou EDITBOX_FAILURE.
     */
    extern int editbox_unselect(int editboxId);

    /**
     * @brief Obtem a situacao atual do editbox (selecionado ou deselecionado).
     * @param int editboxId     Id do editbox.
     * @return int              Retorna true (1) para selecionado ou false (0) para deselecionado. Em caso de falha EDITBOX_FAILURE.
     */
    extern int editbox_read(int editboxId);

    /**
     * @brief Seta um valor para a borda do editbox
     * @param int editboxId     Id do editbox a ser alterado
     * @param int border        Numero de pixels da borda
     * @return int              Retorna EDITBOX_SUCCESS ou EDITBOX_FAILURE
     */
    extern int editbox_setBorder(int editboxId, unsigned int border);

    /**
     * @brief Seta se o editbox pode ser visivel ou nao.
     * @param int editboxId     Id do editbox
     * @param unsigned char visibility      true (1) ou false (0).
     * @return int              Retorna EDITBOX_SUCCESS ou EDITBOX_FAILURE.
     */
    extern int editbox_setVisible(int editboxId, unsigned char visibility);

    /**
     * @brief Seta um novo texto para o editbox.
     * @param int editboxId     Id do editbox.
     * @param unsigned char *text        Novo texto para ser atribuido ao editbox.
     * @return int              Retorna EDITBOX_SUCCESS ou EDITBOX_FAILURE.
     * @see editbox_setMode_numeric
     * @see editbox_setMode_password
     * @see editbox_setMode_text
     */
    extern int editbox_setText(int editboxId, unsigned char *text);

    /**
     * @brief Obtem o texto atual do editbox
     * @param int editboxId     Id do editbox.
     * @param unsigned char *txt         Buffer para escrita do texto.
     * @return int              Retorna EDITBOX_SUCCESS ou EDITBOX_FAILURE.
     */
    extern int editbox_getText(int editboxId, unsigned char *txt);

    /**
     * @brief Seta se o editbox pode ser editado.
     * @param int editboxId     Id do editbox.
     * @param unsigned char editable     true (1) ou false (0).
     * @return int              Retorna EDITBOX_SUCCESS ou EDITBOX_FAILURE.
     */
    extern int editbox_setEditable(int editboxId, unsigned char editable);

    /**
     * @brief Seta o modo do editbox para numerico.
     * @param editboxId         Id do editbox.
     * @return  int             Retorna EDITBOX_SUCCESS ou EDITBOX_FAILURE.
     */
    extern int editbox_setMode_numeric(int editboxId);

    /**
     * @brief Seta o modo do editbox para password.
     * @param editboxId         Id do editbox.
     * @return  int             Retorna EDITBOX_SUCCESS ou EDITBOX_FAILURE.
     */
    extern int editbox_setMode_password(int editboxId);

    /**
     * @brief Seta o modo do editbox para texto.
     * @param editboxId         Id do editbox.
     * @return  int             Retorna EDITBOX_SUCCESS ou EDITBOX_FAILURE.
     */
    extern int editbox_setMode_text(int editboxId);

    /**
     * @brief Retorna o modo do editbox.
     * @param editboxId         Id do editbox.
     * @return  int             Retorna EDITBOX_MODE_NUMERIC, EDITBOX_MODE_PASSWORD ou EDITBOX_MODE_TEXT. Em caso de falha EDITBOX_FAILURE.
     */
    extern unsigned char editbox_getMode(int editboxId);

    extern void editbox_setFontColor(int editboxId, unsigned int font_red,
            unsigned int font_green, unsigned int font_blue);

    extern unsigned int editbox_getWidth(int editboxId);

    extern unsigned int editbox_getBorder(int editboxId);

    extern signed int editbox_setColor(signed int editboxId, unsigned int r, unsigned int g, unsigned int b);

    extern signed int editbox_getFontHeight(signed int editboxId);

    extern signed int editbox_isSelected(signed int editboxId);

#ifdef	__cplusplus
}
#endif
